# 从 Django 中导入 template 模块
from django import template
# 从当前应用的 models 文件中导入 Post 类
from ..models import Post
# 导入聚合函数 Count
from django.db.models import Count
# 导入 mark_safe 函数，用于标记字符串是安全的，可以被输出显示
from django.utils.safestring import mark_safe
# 导入下载安装的 markdown 模块
import markdown

# 使用 template 中的 Library()创建一个自定义标签注册器
register = template.Library()

# 将定义的函数 total_posts 注册为自定义标签
@register.simple_tag
def total_posts():  # 定义一个自定义标签 total_posts
    # 返回当前发布文章的数量
    return Post.published.count()

# 将 show_latest_posts 函数和 blog/post/latest_posts.html 注册为标签
@register.inclusion_tag('blog/post/latest_posts.html')
def show_latest_posts(count=5):  # 默认获取最近发布的 5 篇文章
    # 获取最近发布的文章
    latest_posts = Post.published.order_by('-publish')[:count]
    # 将最近发布的文章传递至模板
    return {'latest_posts': latest_posts}

# 使用 simple_tag 将 get_most_commented_posts 函数注册为自定义模板标签
@register.simple_tag
def get_most_commented_posts(count=5):  # 默认显示 5 篇文章
    # 对已经发布的文章统计评论数量，保存并按照评论数量分组，按评论数量从大到小排序，取前 count 个
    return Post.published.annotate(
        total_comments=Count('comments')
    ).order_by('-total_comments')[:count]

# 使用 filter 函数将 markdown_format 函数注册为自定义过滤器
# 并将名称修改为 markdown
@register.filter(name='markdown')
def markdown_format(text):  # 定义 markdown_format 函数，接收 text 作为参数
    # 使用 markdown 模块提供的 markdown 方法将 markdown 格式的文章
    # 转化为正常阅读形式的文章，再使用 mark_safe 函数将这个字符串
    # 标记为安全，可以输出显示
    return mark_safe(markdown.markdown(text))
